【図解】ELB + ECSの動的ポートマッピング
こんにちは、AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。
今回は、ECS の動的ポートマッピングについてご紹介したいと思います。
動的ポートマッピングとは
動的ポートマッピングとは ELB ターゲットグループで利用するポート番号を動的に上書き、ターゲットと疎通する仕組みです。ターゲットグループ作成時の設定項目の 1 つにポートを指定しますが、この設定値はデフォルトポートとなっており、ターゲット登録時に上書き可能な設定となっております。
その仕組みを利用して、 1 つの ENI で複数の ECS タスクを起動できるようにした機能が、動的ポートマッピングです。
動的ポートマッピングが必要なケース
Docker の Bridge ネットワークモードでは、ホスト側とコンテナ側のポートを分離できます。
ただし、同じホストポートを重複して利用することはできません。そのため、複数の ECS タスク(コンテナ)を同じ EC2 上で起動したい場合は、動的ポートマッピングを利用する必要があります。
動的ポートマッピングでは、ホストポートおよび、ターゲットグループのポート番号を動的に採番、紐付けを行います。
動的ポートマッピングを利用することで、複数タスクを 1 つの EC2 上で起動できるため、リソースを効率的に利用できます。
ポートを決定しているのは誰?
動的ポートマッピングで使用されるホストポートは、コンテナインスタンスの一時ポート範囲と Docker のバージョンから動的に選択されます。
Docker バージョン 1.6.0 以降のデフォルトの一時ポート範囲は、インスタンスの /proc/sys/net/ipv4/ip_local_port_range
に記載されています。
[ec2-user@ip-172-31-47-169 ~]$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[ec2-user@ip-172-31-47-169 ~]$
では、ポートを動的に決定し、ALB のターゲットグループへの登録は誰が行なっているのでしょうか。
CloudTrail から確認すると、ユーザー名:ecs-service-schedulerがターゲットグループに登録していることが確認できました。
また、 ecs-service-scheduler は、アクセスキーが ASIA から始まることから ECS サービスに関連づけされたロールを Assume Role してターゲットに登録作業を行なっていることが確認できます。
ドキュメントでも確認ができました。
サービススケジューラはオプションで、タスクが Elastic Load Balancing ロードバランサーに登録されていることも確認します。サービススケジューラで維持されているサービスを更新できます。これには、新しいタスク定義のデプロイや、実行中のタスクの必要数の変更が含まれる場合があります。
動的ポートマッピングの注意点
動的ポートマッピングはとても便利な機能です。しかし実装には様々な制約があります。
- ECS サービス作成時のみ設定ができる
- 動的ポートマッピングは後から追加・削除などの変更ができない
- サポートされてるロードバランサーは ALB,NLB
- awsvpc, host ネットワークモードは、動的ポートマッピングをサポートしていない
まとめ
動的ポートマッピングについて図を元にまとめてみましたが、奥が深い機能だなと思いました。
この記事がどなたかの参考になればとても嬉しいです。
以上、AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!